const dateObjUtils = {

	UNITS: {
		'年': 31557600000,
		'月': 2629800000,
		'天': 86400000,
		'小时': 3600000,
		'分钟': 60000,
		'秒': 1000
	},

	humanize(milliseconds) {
		let humanize = '';
		for (let key in this.UNITS) {
			if (milliseconds >= this.UNITS[key]) {
				humanize = Math.floor(milliseconds / this.UNITS[key]) + key + '前';
				break;
			}
		}
		return humanize || '刚刚';
	},
	/**
	 * @param {dateStr} yyyy-mm-dd HH:MM:ss || yyyy-mm-dd || 1621468800000 时间戳会转成Number
	 */
	parse(dateStr) {
		let date;
		if (Number(dateStr || 0) > 0) {
			date = Number(dateStr);
		} else {
			date = dateStr.replace(/-/g, '/');
		}
		return new Date(date);
	},
	/**
	 * 时间格式化
	 * @param {dateStr} 2019-10-01 08:00:00 || 1621468800000 时间戳会转成Number
	 * @param {format}  yyyy-MM-dd HH:mm:ss
	 */
	getDateFormat(dateStr, format = 'yyyy-MM-dd HH:mm:ss') {
		if (!dateStr) return format;
		return this.parse(dateStr).format(format)
	},
	/**
	 * @param {dateStr} yyyy-mm-dd HH:MM:ss || yyyy-mm-dd || 1621468800000 时间戳会转成Number
	 * @param {isFriendlyToDay} 是否只显示一天内的友善时间
	 * @return {str} yyyy-mm-dd HH:MM 或 小于1天返回:x前或刚刚
	 */
	friendlyDate(dateStr, isFriendlyToDay = false) {
		if (dateStr == 'null' || typeof(dateStr) == "undefined" || dateStr == '') {
			return dateStr;
		}
		let date = this.parse(dateStr);
		let diff = Date.now() - date.getTime();
		if (diff < this.UNITS['天'] || !isFriendlyToDay) {
			return this.humanize(diff);
		}
		return dateStr;
	},
	/**
	 * 时间转星期
	 * @param {dateStr} yyyy-mm-dd HH:MM:ss || yyyy-mm-dd || 1621468800000 时间戳会转成Number
	 * @param {options} 一个回调 week=>{return `xxx ${week}`} 可以自定义日期文案
	 */
	dateToWeekFormat(dateStr, options) {
		let date = this.parse(dateStr);
		let week = date.getDay();
		let weekArray = new Array("周日", "周一", "周二", "周三", "周四", "周五", "周六");
		if (weekArray.length > week) {
			return options ? options(week) : weekArray[week];
		} else {
			return '未知'
		}
	}
}

/*
时间格式化，参数格式【yyyy-MM-dd HH:mm:ss】
如果想将日期字符串格式化,需先将其转换为日期类型Date
例如：
var str = '2019-07-15 16:35:30'
var date = new Date(Date.parse(str)).format('yyyy-MM-dd HH:mm:ss')
*/
Date.prototype.format = function(format) {
	let date = {
		"M+": this.getMonth() + 1,
		"d+": this.getDate(),
		"H+": this.getHours(),
		"m+": this.getMinutes(),
		"s+": this.getSeconds(),
		"q+": Math.floor((this.getMonth() + 3) / 3),
		"S+": this.getMilliseconds()
	};
	if (/(y+)/i.test(format)) {
		format = format.replace(RegExp.$1, (this.getFullYear() + '').substr(4 - RegExp.$1.length));
	}
	for (let k in date) {
		if (new RegExp("(" + k + ")").test(format)) {
			format = format.replace(RegExp.$1, RegExp.$1.length == 1 ? date[k] : ("00" + date[k]).substr(("" + date[
				k]).length));
		}
	}
	return format;
}

export default {

	/**
	 * 时间格式化
	 * @param {dateStr} 2019-10-01 08:00:00 || 1621468800000 时间戳会转成Number
	 * @param {format}  yyyy-MM-dd HH:mm:ss
	 */
	getDateFormat(dateStr, format = 'yyyy-MM-dd HH:mm:ss') {
		return dateObjUtils.getDateFormat(dateStr, format);
	},

	/**
	 * 友善的时间展示
	 * 例如: xx分钟前
	 * 
	 * @param {dateStr} yyyy-mm-dd HH:MM:ss || yyyy-mm-dd || 1621468800000 时间戳会转成Number
	 * @param {isFriendlyToDay} 是否只显示一天内的友善时间
	 */
	friendlyDate(dateStr, isFriendlyToDay = false) {
		return dateObjUtils.friendlyDate(dateStr, isFriendlyToDay);
	},

	/**
	 * 时间转星期
	 * @param {dateStr} yyyy-mm-dd HH:MM:ss || yyyy-mm-dd || 1621468800000 时间戳会转成Number
	 * @param {options} 一个回调 week=>{return `xxx ${week}`} 可以自定义日期文案
	 */
	dateToWeekFormat(dateStr, options) {
		return dateObjUtils.dateToWeekFormat(dateStr, options);
	},
}
